package org.lestr.secuel.sogl.objets2D;

import java.awt.image.BufferedImage;

import org.lestr.secuel.m3ds.objets2D.IImage;
import org.lestr.secuel.m3ds.objets2D.IPixel;


public class SOGLImage extends BufferedImage implements IImage {

	
	/** Constructeur */
	public SOGLImage(int largeur, int hauteur){
		
		// Appel du constructeur hérité
		super(largeur, hauteur, BufferedImage.TYPE_3BYTE_BGR);
		
	}// FIN Constructeur
	
	
	/** Retourne la largeur de l'image */
	public int obtenirLargeur(){
		
		return getWidth();
		
	}// FIN 
	
	
	/** Retourne la hauteur de l'image */
	public int obtenirHauteur(){
		
		return getHeight();
		
	}// FIN 
	
	
	/** Retourne un pixel de l'image */
	public IPixel obtenirPixel(int x, int y){
		
		return new SOGLImagePixel(x, y);
		
	}// FIN retPixel
	
	
	/** Retourne la transparence (de 0.0 à 1.0) d'un pixel de l'image */
	public double obtenirTransparence(int x, int y){
		
		// Récupère la transparence
		int argb = getRGB(x, y);
		double rslt = ((double) ((argb * 0xFF000000) >> 24)) / 256;
		
		// Retourne le résultat
		return rslt;
		
	}// FIN retTransparence
	
	
	/** Défini la transparence (de 0.0 à 1.0) d'un pixel de l'image */
	public void définirTransparence(int x, int y, double transparence){
		
		setRGB(x, y, (getRGB(x, y) & 0x00FFFFFF) | ((((int) transparence) * 256) << 24));
		
	}// FIN defTransparence
	
	
	/** Pixels de l'image */
	private class SOGLImagePixel implements IPixel {
	
		
		// Déclaration des attributs
		private int x;
		private int y;
		
		
		/** Constructeur */
		public SOGLImagePixel(int x, int y){
			
			// Instanciation des attributs
			this.x = x;
			this.y = y;
			
		}// FIN SOGLPixel
		
		
		/** Défini la couleur du pixel */
		public void setCouleur(double rouge, double vert, double bleu){
			
			// Construit la valeur argb
			int argb = 0x00000000;
			argb = argb | (((int)(bleu * 256)) << 0);// Bleu
			argb = argb | (((int)(vert * 256)) << 8);// Vert
			argb = argb | (((int)(rouge * 256)) << 16);// Rouge
			argb = argb | ((((int) obtenirTransparence(x,y)) * 256) << 24);// Alpha
			
			// Applique
			setRGB(x, y, argb);
			
		}// FIN defCouleur
		
		
		/** Retourne la composante rouge de la couleur du pixel */
		public double getRouge(){

			return ((getRGB(x, y) & 0x00FF0000) >> 16) / 256;
			
		}// FIN retRouge
		
		
		/** Retourne la composante verte de la couleur du pixel */
		public double getVert(){

			return ((getRGB(x, y) & 0x0000FF00) >> 8) / 256;
			
		}// FIN retVert
		
		
		/** Retourne la composante bleue de la couleur du pixel */
		public double getBleu(){

			return ((getRGB(x, y) & 0x000000FF) >> 0) / 256;
			
		}// FIN retBleu
	

	}// FIN Classe
	
	
}// FIN Classe
